package encheres.dao.impl;

import java.util.Date;
import java.util.List;

import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.Transaction;

import encheres.dao.HibernateUtil;
import encheres.dao.IProduitDAO;
import encheres.dao.entities.Client;
import encheres.dao.entities.Produit;
import encheres.dao.entities.Vente;
import encheres.dao.entities.VenteId;

/**
 * Implémente les méthode DAO des objets Produit.
 * @author Nicolas
 *
 */
public class ProduitDAOImpl implements IProduitDAO {

	/**
	 * {@inheritDoc}
	 */
	public void proposerProduit(final Produit produit) throws HibernateException {
		Session session = null;
		Transaction tx = null;
		try {
			session = HibernateUtil.getSessionFactory().openSession();
			tx = session.beginTransaction();
			session.save(produit);
			tx.commit();
			
		} catch (HibernateException e) {
			if(tx != null){
				tx.rollback();
			}
			throw e;
		} finally {
			session.close();
		}
		
	}

	/**
	 * {@inheritDoc}
	 */
	public List<Produit> listProduits() throws HibernateException {
		Session session = null;
		Transaction tx = null;
		try {
			session = HibernateUtil.getSessionFactory().openSession();
			tx = session.beginTransaction();
			List<Produit> listProduits = session.createQuery("From Produit").list();
			return listProduits;
			
		} catch (HibernateException e) {
			if(tx != null){
				tx.rollback();
			}
			throw e;
		} finally {
			session.close();
		}
	}

	/**
	 * {@inheritDoc}
	 */
	public void encherirProduit(final Client client, final Produit produit, final float newPrix,
			final Date date) {
		Session session = null;
		Transaction tx = null;
		try {
			session = HibernateUtil.getSessionFactory().openSession();
			tx = session.beginTransaction();
			VenteId pkVente = new VenteId(client.getIdClient(), produit.getIdProduit(), date);
			Vente enchere = new Vente(pkVente, produit, client, newPrix);
			session.save(enchere);
			tx.commit();
			
		} catch (HibernateException e) {
			if(tx != null){
				tx.rollback();
			}
			throw e;
		} finally {
			session.close();
		}
	}

	/**
	 * {@inheritDoc}
	 */
	public Produit findProduit(final int idProduit) throws HibernateException {
		Session session = null;
		Transaction tx = null;
		try {
			session = HibernateUtil.getSessionFactory().openSession();
			tx = session.beginTransaction();
			String requete = "From Produit p Where p.idProduit="+idProduit;
			Produit p = (Produit)session.createQuery(requete).uniqueResult();
			
			return p;
		} catch (HibernateException e) {
			if(tx != null){
				tx.rollback();
			}
			throw e;
		} finally {
			session.close();
		}
	}
	
	

}
